using System;
using System.Collections.Generic;
using System.Text;
using eVideoStore.Entidades;

namespace eVideoStore.DAL
{
    public class BuilderAplicacion
    {
        private Aplicacion aplicacion;
        private DAOFactory factory = null;

        public BuilderAplicacion()
        {
            factory = AbsDAOFactoriesFactory.getInstance().buildDAOFactory();
        }

        public void buildAplicacion(string id)
        {
            DAOAplicaciones daoAplicaciones = factory.buildDAOAplicacion();
            aplicacion = daoAplicaciones.obtenerPorid(id);

            buildSubMenu(id);
        }

        private Stack<SubMenu> aSubMenuStack = new Stack<SubMenu>();
        public void buildSubMenu(string idAplicacion)
        {
            DAOSubMenues daoSubMenues = factory.buildDAOSubMenues();
            ICollection<SubMenu> subMenues = daoSubMenues.obtenerPorIdAplicacion(idAplicacion);
            aplicacion.SubMenues = subMenues;

            // Para todos los SubMenues, se realiza la carga de los submenues hijos
            foreach(SubMenu sm in subMenues) {
                aSubMenuStack.Push(sm);
                buildSubSubMenu(sm.Id);
                aSubMenuStack.Pop();
            }
        }
        public void buildSubSubMenu(int idASubMenu)
        {
            DAOSubMenues daoSubMenues = factory.buildDAOSubMenues();
            ICollection<SubMenu> subMenues = daoSubMenues.obtenerPorIdSubMenuPadre(idASubMenu);

            // Para todos los SubMenues, se realiza la carga de los submenues hijos
            foreach(SubMenu sm in subMenues) {
                aSubMenuStack.Push(sm);
                buildSubSubMenu(sm.Id);
                aSubMenuStack.Pop();

                aSubMenuStack.Peek().Elementos.Add(sm);
            }
            buildOpcion(idASubMenu);
            buildDivision(idASubMenu);
        }
        public void buildOpcion(int idSubMenu)
        {
            DAOOpciones daoOpciones = factory.buildDAOOpciones();
            ICollection<Opcion> opciones = daoOpciones.obtenerPorIdSubMenu(idSubMenu);
            foreach (Opcion op in opciones)
            {
                aSubMenuStack.Peek().Elementos.Add(op);
            }
        }
        public void buildDivision(int idSubMenu)
        {
            DAODivisiones daoDivisiones = factory.buildDAODivisiones();
            ICollection<Division> divisiones = daoDivisiones.obtenerPorIdSubMenu(idSubMenu);
            foreach (Division di in divisiones)
            {
                aSubMenuStack.Peek().Elementos.Add(di);
            }
        }
        public Aplicacion getResult()
        {
            return aplicacion;
        }
    }
}
